package vip.meeet.helper;


import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.*;

/**
 * https://baomidou.com/config/generator-config.html#datetype
 *
 * https://baomidou.com/guide/generator.html#%E6%B7%BB%E5%8A%A0%E4%BE%9D%E8%B5%96
 */
public class CodeGeneratorHelperA {

    /**
     * 包名
     */
    private static final String PACKAGE_NAME = "vip.meeet";
    /**
     * 模块名称
     */
//    private static final String MODULE_NAME = "dao";
    private static final String MODULE_NAME = "";

    /**
     * 代码生成者
     */
    private static final String AUTHOR = "trayvon";

    /**
     * JDBC相关配置
     */
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/meeet?useUnicode=true&characterEncoding=UTF-8";
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "654321";
//    private static final String PROJECT_PATH = "E:\\union";
//    private static final String PROJECT_PATH = "E:\\newpro\\cvideo\\cvideo\\cvideo-admin";
    private static final String PROJECT_PATH = "E:\\newpro\\meeet\\love\\common";
    private static final String MAVEN_JAVA_PATH = "/src/main/java";
    /**
     * 如果模板引擎是 velocity"/templates/mapper.xml.vm";
     */
    private static final String TEMPLATE_PATH = "/templates/mapper.xml.ftl";

    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        mpg.setGlobalConfig(globalConfig());
        // 数据源配置
        mpg.setDataSource(dataSourceConfig());
        // 包配置
        mpg.setPackageInfo(packageConfig());
        // 自定义配置
        mpg.setCfg(injectionConfig());
        // 配置模板
        mpg.setTemplate(templateConfig());
        // 策略配置
        mpg.setStrategy(strategyConfig());
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }

    /**
     * 自定义配置
     *
     * @return
     */
    private static InjectionConfig injectionConfig() {
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // 注入自定义配置，可以在 VM等模板 中使用 cfg.abc 设置的值
                Map<String, Object> map = new HashMap<String, Object>();
//                map.put("abc", this.getConfig().getGlobalConfig().getAuthor() + "-mp");
                this.setMap(map);
            }
        };

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(TEMPLATE_PATH) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return PROJECT_PATH + "/src/main/resources/mapper/" + MODULE_NAME
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        return cfg;
    }

    private static TemplateConfig templateConfig() {
        TemplateConfig templateConfig = new TemplateConfig();
        // templateConfig.setEntity("templates/entity2.java");
        // templateConfig.setController("...");
        // templateConfig.setEntity("...");
        // templateConfig.setMapper("...");
        // templateConfig.setXml("...");
        // templateConfig.setService("...");
        // templateConfig.setServiceImpl("...");

        templateConfig.setXml(null);
        return templateConfig;
    }

    /**
     * 策略配置
     *
     * @return
     */
    private static StrategyConfig strategyConfig() {
        StrategyConfig strategy = new StrategyConfig();
        // 表名生成策略
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);


        // 写于父类中的公共字段
//        strategy.setSuperEntityColumns("id");
        strategy.setCapitalMode(true);// 全局大写命名
//        strategy.setTablePrefix(new String[]{"t_"});// 表前缀，生成实体的时候去掉前缀
//        strategy.setInclude(new String[]{"user"}); // 需要生成的表
        //        String tables = "sys_user,sys_menu,sys_role,sys_role_menu,sys_user_role";
//        String tables = "sys_user,sys_menu,sys_role";
//        strategy.setInclude(tables);
//        strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
//        strategy.setExclude("city"); // 排除生成的表
        // 自定义实体，公共字段
//        strategy.setSuperEntityColumns(new String[]{"test_id"});

        // 自定义实体父类
//        strategy.setSuperEntityClass("com.baomidou.demo.base.BsBaseEntity");
        // // 自定义 mapper 父类
//        strategy.setSuperMapperClass("com.baomidou.demo.base.BsBaseMapper");
        // // 自定义 service 父类
//        strategy.setSuperServiceClass("com.baomidou.demo.base.BsBaseService");
        // // 自定义 service 实现类父类
//        strategy.setSuperServiceImplClass("com.baomidou.demo.base.BsBaseServiceImpl");
        // 自定义 controller 父类
//        strategy.setSuperControllerClass("com.baomidou.demo.TestController");
        // 【实体】是否生成字段常量（默认 false）
        strategy.setEntityColumnConstant(false);
        // 【实体】是否为lombok模型（默认 false）<a href="https://projectlombok.org/">document</a>
        strategy.setEntityLombokModel(true);
        // Boolean类型字段是否移除is前缀处理
        strategy.setEntityBooleanColumnRemoveIsPrefix(true);
        strategy.setRestControllerStyle(true);
        strategy.setControllerMappingHyphenStyle(false);

//        List<TableFill> tableFillList = new ArrayList<>();
//        TableFill createField = new TableFill("gmt_create", FieldFill.INSERT);
//        TableFill modifiedField = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
//        tableFillList.add(createField);
//        tableFillList.add(modifiedField);
//        strategy.setTableFillList(tableFillList);

        return strategy;
    }

    /**
     * 配置数据源
     *
     * @return
     */
    private static DataSourceConfig dataSourceConfig() {
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(URL);
        dataSourceConfig.setDriverName(DRIVER);
        dataSourceConfig.setUsername(USER_NAME);
        dataSourceConfig.setPassword(PASSWORD);
        return dataSourceConfig;
    }

    /**
     * 包配置
     *
     * @return
     */
    private static PackageConfig packageConfig() {
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(MODULE_NAME);
        pc.setParent(PACKAGE_NAME);
        pc.setController("controller");//控制器包名
        pc.setXml("mapper");//xml包名
        pc.setMapper("mapper");//mapper包名
        return pc;
    }

    /**
     * 全局配置
     *
     * @return
     */
    private static GlobalConfig globalConfig() {
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir(PROJECT_PATH + MAVEN_JAVA_PATH);// 输出目录
        gc.setOpen(true);//生成代码完成打开输出目录
        gc.setSwagger2(false);//  实体属性 Swagger2 注解
        gc.setFileOverride(true);// 是否覆盖文件
        gc.setActiveRecord(true);// 开启 activeRecord 模式
        gc.setEnableCache(false);// XML 二级缓存
        gc.setBaseResultMap(true);// XML ResultMap
        gc.setBaseColumnList(true);// XML columList
        gc.setAuthor(AUTHOR);//作者
        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setXmlName("%sMapper");//xml后缀
        gc.setMapperName("%sMapper");//mapper后缀
        return gc;
    }

    /**
     * <p>
     * 读取控制台内容
     * </p>
     */
    private static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入" + tip + "：");
        System.out.println(help.toString());
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (ipt != null && !ipt.isEmpty()) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "！");
    }

}

